package com.zhu.instructions.references;

import com.zhu.instructions.base.Index16Instruction;
import com.zhu.rtda.Frame;
import com.zhu.rtda.InstanceOop;
import com.zhu.rtda.heap.InstanceKlass;
import com.zhu.rtda.heap.constant.ClassRef;
import com.zhu.rtda.heap.constant.RuntimeConstantPool;

/**
 * NEW 指令：创建类的新实例。
 * <p>
 * 操作码：new
 * 格式：new indexbyte1 indexbyte2
 * </p>
 * <p>
 * 执行过程：
 * 1. 从常量池中获取类符号引用
 * 2. 解析类引用
 * 3. 检查类是否可实例化（非接口、非抽象类）
 * 4. 创建对象实例
 * 5. 将对象引用推入操作数栈
 * </p>
 * <p>
 * 示例：new java/lang/String
 * </p>
 */
public class NEW extends Index16Instruction {

    @Override
    public void execute(Frame frame) {
        // 1. 获取当前方法的常量池
        RuntimeConstantPool constantPool = frame.getMethod().getClazz().getConstantPool();

        // 2. 从常量池中获取类符号引用
        ClassRef classRef = (ClassRef) constantPool.getConstant(this.index);

        // 3. 解析类引用，得到运行时类对象
        InstanceKlass clazz = classRef.resolvedKlass();

        // 4. 检查类是否可实例化
        if (clazz.isInterface() || clazz.isAbstract()) {
            // 抛出 InstantiationError 错误
            throw new RuntimeException("java.lang.InstantiationError");
        }

        // 5. 创建对象实例
        InstanceOop instanceOop = clazz.newObject();

        // 6. 将对象引用推入操作数栈
        frame.getOperandStack().pushRef(instanceOop);
    }
}
